﻿#include "MyRGBImage.h"

MyRGBImage::MyRGBImage(void)
{
}
//Hàm khởi tạo ảnh RGB
MyRGBImage::MyRGBImage(IplImage *img){
	this->RGBImage=img;
}
MyRGBImage::~MyRGBImage(void)
{
}

//Author: 1041338 - Duy Hòa
//Function: Hàm tìm max trong 1 mảng
float MyRGBImage::Max(float a[256]){
	float max=a[0];
	for(int i=0;i<256;i++){
		if(a[i]>max)
			max=a[i];
	}
	return max;
}
//Author: 1041399 - Minh Phượng
//Function: Hàm tính histogram cho ảnh màu cho cả 3 kênh màu.
void MyRGBImage::CalcHist(){
	for(int i=0;i<256;i++){
		this->redHist[i]=0;
		this->greenHist[i]=0;
		this->blueHist[i]=0;
	}
	int imgHeight=this->RGBImage->height;
	int imgWidthStep=this->RGBImage->widthStep;
	int step=this->RGBImage->widthStep;
	int n=imgHeight*this->RGBImage->width;
	uchar*data=(uchar*)this->RGBImage->imageData;
	
	for(int j=0;j<imgHeight*imgWidthStep-2;j+=this->RGBImage->nChannels){
		this->blueHist[data[j]]+=(float)1/n;
		this->greenHist[data[j+1]]+=(float)1/n;
		this->redHist[data[j+2]]+=(float)1/n;
	}
}



//Author: 1041338 - Duy Hòa
//Function: Hàm vẽ histogram cho cả 3 kênh màu
IplImage* MyRGBImage::DrawHistogram(float colWidth, float maxHeight){
	
	//Tạo ảnh rỗng
	IplImage * histImg=cvCreateImage(cvSize(256*colWidth,maxHeight),8,3);
	
	//Tính histogram cho ảnh màu
	this->CalcHist();

	//Lấy giá trị max trong histogram từng kênh màu.
	float maxRed=this->Max(this->redHist);
	float maxGreen=this->Max(this->greenHist);
	float maxBlue=this->Max(this->blueHist);
	
  //Vẽ nền màu trắng cho histogram
	cvRectangle(histImg,cvPoint(0,0),cvPoint(histImg->width,histImg->height),cvScalar(255,255,255),CV_FILLED,8,0);

	//Vẽ histogram theo đường 
	for(int i=0,j=0;i<256-1 && j<(256*colWidth);i++,j+=colWidth){
		
		//Tính chiều cao cho lượt đồ Red
		float x1=(this->redHist[i]*maxHeight)/maxRed;
		float x2=(this->redHist[i+1]*maxHeight)/maxRed;
		//Tính chiều cao cho lượt đồ Green
		float y1=(this->greenHist[i]*maxHeight)/maxGreen;
		float y2=(this->greenHist[i+1]*maxHeight)/maxGreen;
		//Tính chiều cao cho lược đồ Blue
		float z1=(this->blueHist[i]*maxHeight)/maxBlue;
		float z2=(this->blueHist[i+1]*maxHeight)/maxBlue;

		//Vẽ lược đồ theo đường
		cvLine(histImg,cvPoint(j,maxHeight-x1),cvPoint(j+colWidth,maxHeight-x2),cvScalar(0,0,255),1,8,0);
		cvLine(histImg,cvPoint(j,maxHeight-y1),cvPoint(j+colWidth,maxHeight-y2),cvScalar(0,255,0),1,8,0);
		cvLine(histImg,cvPoint(j,maxHeight-z1),cvPoint(j+colWidth,maxHeight-z2),cvScalar(255,0,0),1,8,0);
		
	}

	return histImg;

}